/* -*- c++ -*- */
/*
 * Copyright 2006,2009,2013 Free Software Foundation, Inc.
 *
 * This file is part of GNU Radio
 *
 * SPDX-License-Identifier: GPL-3.0-or-later
 *
 */

#if HAVE_CONFIG_H
#include <config.h>
#endif

#include <gnuradio/constants.h>
#include <stdlib.h>
#include <boost/dll/runtime_symbol_info.hpp>
#include <filesystem>

namespace gr {

const std::string prefix()
{
    // Use "GR_PREFIX" environment variable when specified
    const char* prefix = getenv("GR_PREFIX");
    if (prefix != NULL)
        return prefix;

    std::filesystem::path prefix_rel_lib = "@prefix_relative_to_lib@";
    std::filesystem::path gr_runtime_lib_path = boost::dll::this_line_location().string();
    // Normalize before decomposing path so result is reliable
    std::filesystem::path prefix_path =
        gr_runtime_lib_path.lexically_normal().parent_path() / prefix_rel_lib;
    return prefix_path.lexically_normal().string();
}

const std::string sysconfdir()
{
    std::filesystem::path sysconfdir_rel_prefix = "@SYSCONFDIR_relative_to_prefix@";
    std::filesystem::path prefix_path = prefix();
    std::filesystem::path sysconfdir_path = prefix_path / sysconfdir_rel_prefix;

    return sysconfdir_path.lexically_normal().string();
}

const std::string prefsdir()
{
    std::filesystem::path prefsdir_rel_prefix = "@GR_PREFSDIR_relative_to_prefix@";
    std::filesystem::path prefix_path = prefix();
    std::filesystem::path prefsdir_path = prefix_path / prefsdir_rel_prefix;

    return prefsdir_path.lexically_normal().string();
}

const std::string build_date() { return "@BUILD_DATE@"; }

const std::string version() { return "@VERSION@"; }

// Return individual parts of the version
const std::string major_version() { return "@MAJOR_VERSION@"; }

const std::string api_version() { return "@API_COMPAT@"; }

const std::string minor_version() { return "@MINOR_VERSION@"; }

const std::string c_compiler() { return "@cmake_c_compiler_version@"; }

const std::string cxx_compiler() { return "@cmake_cxx_compiler_version@"; }

const std::string compiler_flags() { return "@COMPILER_INFO@"; }

const std::string build_time_enabled_components() { return "@_gr_enabled_components@"; }
} /* namespace gr */
